package com.aabte.design2.creational.factorymethod;

import java.util.HashMap;
import java.util.Map;

/**
 * 基础对话框类使用不同的 UI 组件渲染窗口。 在不同的操作系统下， 这些组件外观或许略有不同， 但其功能保持一致。 Windows 系统中的按钮在 Linux 系统中仍然是按钮。
 * <p>
 * 如果使用工厂方法， 就不需要为每种操作系统重写对话框逻辑。 如果我们声明了一个在基本对话框类中生成按钮的工厂方法， 那么我们就可以创建一个对话框子类， 并使其通过工厂方法返回 Windows 样式按钮。 子类将继承对话框基础类的大部分代码， 同时在屏幕上根据 Windows 样式渲染按钮。
 * <p>
 * 如需该模式正常工作， 基础对话框类必须使用抽象按钮 （例如基类或接口）， 以便将其扩展为具体按钮。 这样一来， 无论对话框中使用何种类型的按钮， 其代码都可以正常工作。
 *
 * @author Daniel
 * @version 1.0
 * @date 2020/5/2
 */
public class Application {

    private AbstractDialog dialog;

    /**
     * 当前客户端代码会与具体创建者的实例进行交互，但是必须通过其基本接口
     * 进行。只要客户端通过基本接口与创建者进行交互，你就可将任何创建者子
     * 类传递给客户端。
     */
    public static void main(String[] args) {
        Application application = new Application();
        application.initialize();
        application.dialog.render();
    }

    /**
     * 程序根据当前配置或环境设定选择创建者的类型
     */
    public void initialize() {
        Map<String, String> config = readApplicationConfigFile();
        String os = config.get("os");
        switch (os) {
            case "windows":
                dialog = new WindowsDialog();
                break;
            case "web":
                dialog = new WindowsDialog();
                break;
            default:
                break;
        }
    }

    private Map<String, String> readApplicationConfigFile() {
        Map<String, String> config = new HashMap<>(1);
        config.put("os", "windows");
        return config;
    }

}

